import sys
from typing import Dict, Any

from pathlib import Path
sys.path.append(str(Path(__file__).parent.parent.parent))

from utils.dingtalk_sender import DingTalkSender  # 使用之前创建的钉钉发送模块
from config.config import loadConfigure

class TestCaseReporter:
    """
    测试用例报告生成器，支持将测试步骤格式化为带颜色的Markdown并发送到钉钉
    """

    def __init__(self, dingtalk_webhook: str, dingtalk_secret: str = None):
        """
        初始化

        :param dingtalk_webhook: 钉钉机器人Webhook地址
        :param dingtalk_secret: 钉钉加签密钥(可选)
        """
        self.dingtalk_sender = DingTalkSender(dingtalk_webhook, dingtalk_secret)

    def _colorize_message(self, message: str, is_success: bool) -> str:
        """
        根据成功/失败状态给消息添加颜色标记

        :param message: 原始消息
        :param is_success: 是否成功
        :return: 带颜色标记的消息
        """
        if is_success:
            return f'<font color="#00FF00">{message}</font>'  # 绿色表示成功
        else:
            return f'<font color="#FF0000">{message}</font>'  # 红色表示失败

    def _parse_step_result(self, msg: str) -> bool:
        """
        解析步骤结果是否为成功

        :param msg: 步骤消息
        :return: 是否成功
        """
        success_keywords = ['成功', 'passed', '完成', '正常']
        return any(keyword in msg for keyword in success_keywords)

    def format_test_case(self, case_data: Dict[str, Any]) -> str:
        """
        格式化测试用例数据为Markdown文本

        :param case_data: 测试用例数据，格式如：
            {
                'case1': 'login',
                'step1': {'name': '打开url', 'msg': '操作成功'},
                ...
            }
        :return: 格式化后的Markdown文本
        """
        # 获取项目名称
        loadconf = loadConfigure()
        project_name = loadconf["config"]["project"]
        markdown_lines = [f"## {project_name}"]

        # 获取用例名称
        casenames = sorted(k for k in case_data.keys() if k.startswith("case"))
        # 处理每个步骤
        for case in casenames:
            markdown_lines.append(f'### {case_data[case]["case_name"]}')
            step_keys = sorted([k for k in case_data[case].keys() if k.startswith("step")])
            for step in step_keys:
                step_data = case_data[case][step]
                step_name = step_data.get("name", '未知步骤')
                step_msg = step_data.get("msg", '未知结果')
                # 判断是否有成功并添加颜色
                is_success = self._parse_step_result(step_msg)
                colored_msg = self._colorize_message(step_msg, is_success)
                # 格式化成步骤脚本
                step_num = step.replace("step", '')
                markdown_lines.append(f"{step_num}. {step_name} ----> {colored_msg}")


        return "\n".join(markdown_lines)
        # 处理每个步骤

        # for step_key in step_keys:
        #     step_data = case_data[step_key]
        #     step_name = step_data.get("name", '未知步骤')
        #     step_msg = step_data.get("msg", '未知结果')
        #
        #     # 判断是否有成功并添加颜色
        #     is_success = self._parse_step_result(step_msg)
        #     colored_msg = self._colorize_message(step_msg, is_success)
        #
        #     # 格式化成步骤脚本
        #     step_num = step_key.replace("step", '')
        #     markdown_lines.append(f"{step_num}. {step_name} ----> {colored_msg}")
        #
        # return "\n".join(markdown_lines)

    def send_test_report(self, case_data: Dict[str, Any], at_mobiles: list = None, at_all: bool = False):
        """

        格式化测试用例并发送到钉钉

        :param case_data: 测试用例数据
        :param at_mobiles: 要@的手机号列表
        :param at_all: 是否@所有人
        """
        markdown_content = self.format_test_case(case_data)
        # 添加报告标题和总结
        # case_name = next((v for k, v in case_data.items() if k.startswith("case")))
        #title = f"巡检报告： {case_name[0] if case_name else '巡检报告'}"
        title = "巡检报告"
        self.dingtalk_sender.send_markdown(
            title=title,
            text=markdown_content,
            at_mobiles=at_mobiles,
            at_all=at_all
        )





